﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TicketsPhone.Web.Models;
using TicketsPhone.Domain.Access;
using TicketsPhone.Domain.Entities;
using TicketsPhone.Web.Utils;

namespace TicketsPhone.Web.Controllers
{
    public class PerfilesController : BaseController, IConsultasSeccion<PerfilFormModel>
    {
        PerfilRepositorio _perfil = new PerfilRepositorio();
        PermisoRepositorio _permiso = new PermisoRepositorio();

        public TipoModulo ModuloActual
        {
            get { return TipoModulo.Perfiles; }
        }

        public ActionResult Listar()
        {
            PerfilFormModel model = new PerfilFormModel();
            List<Perfil> lista = new List<Perfil>();

            _perfil.Objeto = new Perfil();

            if (!string.IsNullOrEmpty(Request.QueryString["buscador"]))
            {
                _perfil.Objeto.Nombre = Request.QueryString["buscador"];
            }

            model.CargarDatosPaginados(_perfil.Filtrar());

            return View(model);
        }

        public ActionResult Editar(int id)
        {

            
            PerfilFormModel model = new PerfilFormModel();
            model.Objeto = _perfil.Cargar(id);
            model.PermisosModulos = _perfil.ObtenerTodosLosPermisos(id);

            if (model.Objeto.IdPerfil.HasValue)
            {
                return View(model);
            }
            else
            {
                return RedirectToAction("Listar");
            }
        }

        [HttpPost]
        public ActionResult Editar(PerfilFormModel model, int id)
        {
            if (ModelState.IsValid)
            {
                GuardarPerfil(model, id);
            }

            return View(model);
        }

        public ActionResult Crear()
        {
            PerfilFormModel model = new PerfilFormModel();
            model.PermisosModulos = _perfil.ObtenerTodosLosPermisos(0);
            return View(model);
        }

        [HttpPost]
        public ActionResult Crear(PerfilFormModel model)
        {
            if (ModelState.IsValid)
            {
                GuardarPerfil(model, 0);
            }

            return View(model);
        }

        public ActionResult Eliminar(int id)
        {
            BaseModel model = new BaseModel();

            if (_perfil.Eliminar(id))
                model.Javascript = Scripts.RedireccionConMensaje("/Perfiles/Listar", "Perfil eliminado correctamente");
            else
            {
                string mensaje = "El perfil no se pudo eliminar";
                
                if (_perfil.TipoError == TipoErrorSql.ReferenceConstraint)
                {
                    if (_perfil.Error.IndexOf("FK_Permiso_Perfil") > 0)
                    {
                        mensaje = "ERROR: El perfil tiene permisos asociados.";
                    }
                    else if (_perfil.Error.IndexOf("FK_Usuario_Perfil") > 0)
                    {
                        mensaje = "ERROR: El perfil tiene usuarios asociados.";
                    }
                }


                model.Javascript = Scripts.RedireccionConMensaje("/Perfiles/Listar", mensaje);
            }

            return View(model);
        }


        #region Metodos

        /// <summary>
        /// Inserta o elimina los permisos en un módulo definido
        /// </summary>
        /// <param name="permisos">listado de permisos en determinado modulo</param>
        /// <param name="idPerfil">id del perfil a actualizar</param>
        /// <returns>true si no ocurrieron errores</returns>
        private bool EditarPermisos(List<PermisosModulo> permisos, int idPerfil)
        {

            try
            {
                _permiso.Objeto = new Permiso();
                _permiso.Objeto.Perfil.IdPerfil = idPerfil;

                    foreach (var permisosModulo in permisos)
                    {
                        _permiso.Objeto.Modulo.IdModulo = permisosModulo.Modulo.IdModulo;

                        _permiso.Objeto.TipoPermiso = TipoPermiso.Crear;
                        if (permisosModulo.Crear)
                            _permiso.Crear();
                        else
                            _permiso.Eliminar(0);

                        _permiso.Objeto.TipoPermiso = TipoPermiso.Editar;
                        if (permisosModulo.Editar)
                            _permiso.Crear();
                        else
                            _permiso.Eliminar(0);

                        _permiso.Objeto.TipoPermiso = TipoPermiso.Eliminar;
                        if (permisosModulo.Eliminar)
                            _permiso.Crear();
                        else
                            _permiso.Eliminar(0);

                        _permiso.Objeto.TipoPermiso = TipoPermiso.Listar;
                        if (permisosModulo.Listar)
                            _permiso.Crear();
                        else
                            _permiso.Eliminar(0);
                    }

                    return true;
            }
            catch(Exception e)
            {
                LogErroresRepositorio.GuardarLog(e);
                return false;
            }
           
        }

        private PerfilFormModel GuardarPerfil(PerfilFormModel model, int id)
        {

            _perfil.Objeto = model.Objeto;
            _perfil.Objeto.FechaModificacion = DateTime.Now;

            bool operacionExitosa = false;

            TipoTransaccion tipoTransaccion = TipoTransaccion.Editar;

            if (id == 0)
            {
                id = _perfil.Crear();
                _perfil.Objeto.IdPerfil = id;
                operacionExitosa = id > 0;
                tipoTransaccion = TipoTransaccion.Crear;
            }
            else
            {
                _perfil.Objeto.IdPerfil = id;
                operacionExitosa = _perfil.Editar();
            }

            if (operacionExitosa)
            {
                GuardarLogTransaccion(tipoTransaccion, model.Objeto);
                if (this.EditarPermisos(model.PermisosModulos, id))
                {
                    model.Javascript = Scripts.RedireccionConMensaje("/Perfiles/Listar", "Perfil guardado correctamente");
                }
                else
                {
                    model.Javascript = Scripts.Alert("El perfil no se pudo guardar");
                }
            }
            else
            {
                if (_perfil.TipoError == TipoErrorSql.Unique)
                    model.Javascript = Scripts.Alert("El nombre del perfil ya existe. Intente de nuevo.");
                else
                    model.Javascript = Scripts.Alert("El perfil no se pudo guardar");
            }

            return model;
        }
        #endregion

    }
}
